<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 工厂模式 

        // function Factory(name,age){
        //     let obj = {};  // 原材料
        //     obj.name = name;  // 加工原料
        //     obj.age = age;
        //     return obj;  // 出厂 
        // }

        // let myobj = Factory("张三",20);
        // console.log(myobj);

        // 构造函数  类似工厂模式
        // new 做了 工厂模式的事情
        // new ：1.函数内部创建一个空对象  2. 把这个空对象和this绑定在一起
        //       3.可以执行函数  4.隐式返还这个this



        function Factory(name,age){
            // let obj = {};  // 原材料
            this.name = name;  // 加工原料
            this.age = age;
            // return obj;  // 出厂 
            // return obj
            // return {name:11111};
        }
        Factory.prototype.hobby = function(){
            console.log("喜欢篮球");
        }
        // let myobj = new Factory("张三",20);
        // console.log(myobj);
        /* 
            创建一个空的简单JavaScript对象（即{}）；
            为步骤1新创建的对象添加属性__proto__，将该属性链接至构造函数的原型对象 ；
            将步骤1新创建的对象作为this的上下文 ；
            如果该函数没有返回对象，则返回this。
        */
       
        function myNew(fn,name,age){
            let obj = {};
            obj.__proto__ = fn.prototype;
            fn.apply(obj,[name,age]);
            if(typeof fn() == "undefined"){
                // fn构造函数没有返还结果
                return obj;
            }else{
                return fn();
            }
        }
        let myobj = myNew(Factory,"张三",20);

        console.log(myobj);



    </script>
</body>
</html>